package util

import (
	"bufio"   // 提供带缓冲的文件读取功能，高效处理文件行读取
	"os"      // 提供文件操作相关功能（如打开文件）
	"strings" // 提供字符串处理工具（如前缀判断、裁剪）
)

// ParseMDContent 解析Markdown（.md）文件内容
// 核心功能：提取文件中第一个一级标题（# 开头的行）作为标题，文件全部内容作为正文
// 参数：
//
//	filePath string：待解析的MD文件路径（绝对路径或相对路径，需确保程序有读取权限）
//
// 返回值：
//
//	title string：提取的MD文件标题（无一级标题时返回默认值 "Untitled Document"）
//	content string：MD文件的完整内容（保留原始换行格式）
//	err error：解析过程中出现的错误（如文件不存在、权限不足、读取失败等）
func ParseMDContent(filePath string) (title, content string, err error) {
	// 1. 打开MD文件
	// os.Open() 以只读模式打开文件，返回文件句柄（*os.File）和可能的错误
	file, err := os.Open(filePath)
	if err != nil {
		// 若打开文件失败（如文件不存在），直接返回空标题、空内容和错误
		return "", "", err
	}
	// 延迟关闭文件：函数执行结束前（无论是否报错）确保文件句柄被释放，避免资源泄漏
	defer file.Close()

	// 2. 初始化文件扫描器
	// bufio.NewScanner() 创建带缓冲的文件扫描器，默认按行读取文件内容
	scanner := bufio.NewScanner(file)

	// 3. 定义变量存储文件内容和默认标题
	var lines []string          // 存储文件每一行内容的切片
	title = "Untitled Document" // 标题默认值（无一级标题时使用）

	// 4. 逐行扫描文件内容
	// scanner.Scan() 读取下一行内容，返回bool值：true表示读取成功，false表示读取结束或出错
	for scanner.Scan() {
		// 获取当前行的文本内容（自动去除行尾的换行符 \n 或 \r\n）
		line := scanner.Text()

		// 将当前行添加到lines切片，用于后续拼接完整内容
		lines = append(lines, line)

		// 提取第一个一级标题：仅当标题仍为默认值时处理（确保只取第一个# 标题）
		// strings.HasPrefix(line, "# ") 判断当前行是否以 "# " 开头（一级标题格式，避免匹配## 二级标题等）
		if strings.HasPrefix(line, "# ") && title == "Untitled Document" {
			// strings.TrimPrefix(line, "# ") 去除行首的 "# " 前缀，得到纯标题文本
			title = strings.TrimPrefix(line, "# ")
		}
	}

	// 5. 拼接完整文件内容
	// strings.Join(lines, "\n") 将lines切片中的所有行用 "\n" 连接，还原文件原始换行结构
	content = strings.Join(lines, "\n")

	// 6. 检查扫描过程是否出错（如读取文件时IO错误）
	// scanner.Err() 返回扫描过程中积累的错误（无错误时返回nil）
	return title, content, scanner.Err()
}
